const data = [
  {
    id: 1,
    name: "0",
    children: [
      { id: 2, name: "0-1", children: [{ id: 6, name: "0-1-1" }] },
      { id: 7, name: "0-2", children: [{ id: 8, name: "0-2-1" }] },
    ],
  },
  {
    id: 3,
    name: "1",
    children: [{ id: 4, name: "1-1", children: [{ id: 5, name: "1-1-1" }] }],
  },
];

// 广度优先遍历
// 会修改原数组建议使用的时候深拷贝一份数据
function broadErgodic(treeArr) {
  const arr = [];
  while (treeArr.length > 0) {
    const node = treeArr.shift();
    arr.push(node);
    node.children && treeArr.push(...node.children);
  }
  return arr;
}

// console.log(broadErgodic(JSON.parse(JSON.stringify(data))));

/**
 * 广度优先遍历方法
 * @param {an[]} tree 原始树状数据
 * @param {Function} func 回调函数
 * @returns 递归结果
 */
function treeForeach(tree, func) {
  let node /** 临时节点 */,
    list = [...tree] /** 展开运算符，展开节点 */,
    result = []; /** 最终返回结果 */

  // 遍历体
  while ((node = list.shift())) {
    // 执行回调方法
    // func(node)

    // 临时创建一个节点，保存在结果中
    let tmpNode = {
      id: node.id,
      name: node.name,
    };
    result.push(tmpNode);

    // 改变list，使得 while 条件进行下去
    node.children && list.push(...node.children);
  }
  // 返回结果
  return result;
}

// console.log(treeForeach(data, (item) => console.log(item.name)));
// console.log(data);

const result = treeForeach(data);
console.log(result);
